上一回我們聊到投信數據的處理,這篇來講講價量和投信兩邊都要處理的部分,包括清除非必要欄位和缺失值處理。
在處理資料的第一步,就是把那些不需要的欄位先清掉。因為有些數據是後續可以直接計算出來的,比如 "漲跌幅",或者籌碼資料裡的 "Investment Trust" 這類多餘的項目。這樣不僅可以節省存儲空間,還能更專注於我們要處理的重要欄位,尤其是處理缺失值時,更方便不同來源數據的整合。
以台泥(1101)為例,這是我們抓下來的資料:
date | stock_id | Trading_Volume | Trading_money | open | max | min | close | spread | Trading_turnover |
---|---|---|---|---|---|---|---|---|---|
2020-01-02 | 1101 | 18470566 | 813465904 | 43.8 | 44.15 | 43.8 | 44.1 | 0.4 | 6251 |
2020-01-03 | 1101 | 18387114 | 807459827 | 44.15 | 44.25 | 43.45 | 43.95 | -0.15 | 6733 |
像這裡的 spread
和 Trading_turnover
就沒什麼用了,我們只要保留 日期
、股票代碼
、成交量
、開盤價
、最高價
、最低價
、收盤價
這幾個欄位就好。下面這段程式碼就是處理的方式:
import pandas as pd
df = pd.read_csv('C:\\path_to_csv.csv')
df_cleaned = df[['date', 'stock_id', 'Trading_Volume', 'open', 'max', 'min', 'close']]
df_cleaned.to_csv('C:\\path_to_cleaned_csv.csv', index=False)
再來看籌碼資料,還是以台泥(1101)為例,這是我們的原始資料:
date | stock_id | buy | name | sell | Buy_Sell_Net |
---|---|---|---|---|---|
2020-01-02 | 1101 | 0 | Investment_Trust | 5000 | -5000 |
2020-01-03 | 1101 | 14000 | Investment_Trust | 0 | 14000 |
這邊我們只需要 日期
、股票代碼
、買賣超
這三個欄位就夠了,其他的欄位都可以刪掉。程式碼如下:
import pandas as pd
df = pd.read_csv('C:\\path_to_csv.csv')
df_cleaned = df[['date', 'stock_id', 'Buy_Sell_Net']]
df_cleaned.to_csv('C:\\path_to_cleaned_csv.csv', index=False)
我們這次處理的資料範圍是2020-01-01到2024-09-27,針對那些有投信買賣數據的股票,透過和加權指數的日期比對,找出資料中的異常缺失。
根據資料的狀況,缺失值的原因大致可以分成三類:
股票還沒上市或還沒開始交易
有些股票可能在資料開始的時候還沒上市或還沒開始交易,這類缺失我們視為合理的,不需要補全。
股票暫停交易或處置狀態
有些股票在特定日期因為暫停交易或處置而沒有資料,這些缺失也算是合理的,也不用補全。
FinMind 自身的缺失
FinMind 的資料有時候會出現缺失,這類異常缺失我們需要從其他數據來源補齊,像 XQ 或 Yahoo Finance。不過這次我們只會用 XQ,因為我發現 yfinance 的數據有時候不太準。
股票還沒上市時,資料中會出現連續的缺失,直到某一天開始有數據。這時候我們可以合理判斷,早期的缺失是因為股票還沒上市或沒開始交易,所以這些缺失值可以被視為合理的,不用再處理。
具體步驟:
有些股票會因為公司暫停交易或處置,導致特定日期的數據缺失,這類缺失是正常的,不需要補全。我們通常會透過公告來確認這些情況。
步驟:
標記合理缺失:
確定某支股票在特定日期暫停交易後,我們就把這些日期的數據標記為合理缺失,不需要再補全。
排除合理缺失:
跟上市前無交易資訊的情況一樣,這些合理缺失在後續補全過程中會被排除,避免被誤當成異常缺失。
注意:
雖然我們可以透過證交所和櫃買中心的網站查到一些暫停交易的資料,但有些資訊可能不完整,所以還要靠其他媒體或新聞來源確認該股票是否在某個日期真的暫停交易。確定後,才會把缺失值排除掉。
FinMind 的資料有時候會出現缺失,這種情況通常是異常的,無法視為合理缺失。為了確保資料的完整性,我們需要從其他數據來源補齊這些缺失。在這裡,我們只會用 XQ 來補齊,因為我們發現 yfinance 有時候抓下來的數據會有錯誤,為了避免這些問題,決定只用 XQ 的數據。
步驟:
找出異常缺失:
比對加權指數的完整日期,找出那些 FinMind 資料源的異常缺失。
從 XQ 補齊數據:
利用 XQ 的數據補齊這些缺失。我們選擇 XQ 是因為它的數據相對穩定,歷史交易數據準確,可以避免 yfinance 可能帶來的數據錯誤。
標記無法補齊的數據:
如果有些數據實在無法補齊,我們會記錄下這些日期和股票,並標註為無法補齊,方便後續處理。
在處理完缺失值後,接下來就是把價量數據和籌碼數據進行結合,這樣我們就可以在一個資料集裡看到完整的價量和籌碼資訊。這個步驟非常重要,因為後續的分析或是模型訓練,都需要這些資料整合在一起,才能提供更好的預測效果。
步驟:
資料合併:
首先,我們會針對每支股票,將處理過的價量數據與籌碼數據進行合併,並按照日期對齊。這樣不管是價量資訊,還是投信的籌碼動向,都能在同一份資料裡同步呈現。
填補缺失數據:
如果某些日期只有價量數據,沒有籌碼數據,或反過來,只有籌碼數據沒有價量數據,我們會用空值(NaN)來補齊,這樣能保證每個日期都有完整的欄位,方便後續分析。
保存資料:
最後,將這些合併後的資料保存成一個新的 CSV 檔案,這份資料集將會成為我們後續 LSTM 模型訓練和預測的基礎資料。